﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
using Host.remoting;
using System.Threading;
using System.Windows.Threading;
using Host.Encriptacion;
using Host.Validaciones;


namespace Host
{
    /// <summary>
    /// Interaction logic for MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window
    {
        Thread compruebaNuevosMensajes;
        Desencriptador desencriptador;

        public MainWindow()
        {
            InitializeComponent();
            this.Loaded += new RoutedEventHandler(MainWindow_Loaded);
        }

        void MainWindow_Loaded(object sender, RoutedEventArgs e)
        {
            Datos datos = new Datos();
            desencriptador = new Desencriptador();
            IO.salidaReferencia = this.Salida;
            
            DatosGroupBox.DataContext = datos;
            //levanta al servidor
            Servidor servidor = new Servidor();
            //Se inicializa el threat que pregunta si ha llegado un nuevo mensaje
            compruebaNuevosMensajes = new Thread(HayNuevoMensaje);
            compruebaNuevosMensajes.Start();
        }

        //cierra el threat
        protected override void OnClosed(EventArgs e)
        {
            finalizaThreat();
            base.OnClosed(e);
        }

        //metodo que implementa el threat
        public void HayNuevoMensaje()
        {
            while (true)
            {
                if (RemotableType.nuevoMensajeRecibido)
                {

                    this.Dispatcher.Invoke(DispatcherPriority.Normal,
                        new Action(
                            delegate()
                            {
                                this.TextoFuente.Clear();
                                this.Salida.Items.Clear();
                                this.Salida.Items.Add("Texto cifrado\n");
                                this.Salida.Items.Add(IO.BitArrayToString(RemotableType.textoCifrado, 32));
                                MessageBox.Show(this, "Servidor: Se ha recibido un nuevo mensaje",
                                    "Servidor", 
                                    MessageBoxButton.OK, 
                                    MessageBoxImage.Information);
                                RemotableType.nuevoMensajeRecibido = false;
                                
                            }

                            ));
                  }
            }
        }

        private void finalizaThreat()
        {
                compruebaNuevosMensajes.Abort();
                compruebaNuevosMensajes.Join();
        }

        private void encriptarButton_Click(object sender, RoutedEventArgs e)
        {
            if (Validator.IsValid(this.DatosGroupBox))
            {
                Salida.Items.Clear();
                TextoFuente.Clear();
                string clave = Clave.Text;
                string textoDesencriptado = "";

                //desencriptamos el mensaje
                if (RemotableType.textoCifrado == null)
                {
                    MessageBox.Show("No se ha recibido ningún mensaje",
                    "Error", MessageBoxButton.OK, MessageBoxImage.Error);
                    TextoFuente.Clear();
                    Salida.Items.Add("No se ha recibido ningún mensaje para ser desencriptado");
                }
                else
                {
                    Salida.Items.Clear();
                    textoDesencriptado = "";
                    textoDesencriptado = desencriptador.Desencripta(RemotableType.textoCifrado, clave);
                    //salida por pantalla
                    TextoFuente.Text =textoDesencriptado;
                    Salida.Items.Add("El texto fue desencriptado\n");
                    textoDesencriptado = "";
                    desencriptador.texto = "";
                }

            }
            else
            {
                MessageBox.Show("La clave es inválida",
                    "Error", MessageBoxButton.OK, MessageBoxImage.Error);
            }
        }
    }
}
